﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace bll
{
    /// <summary>
    /// clsUserCollection: Verwalten der Menge von clsTimeSheet-Objekten
    /// </summary>
 
    public class clsTimeSheetCollection
    {
        string _databaseFile;   // String zur Access-Datei, wird im Konstruktor initialisiert
 
        /// <summary>
        /// TimeSheet-Collection Konstruktor 
        /// </summary>
        public clsTimeSheetCollection() 
        {   
            // hier wird der Pfad zur Access-Datei aus web.config gelesen
            _databaseFile = System.Configuration.ConfigurationManager.AppSettings["AccessFileName"];
        }

        /// <summary>
        /// Replies all Timesheets that were created in the past
        /// </summary>
        /// <returns></returns>
        public List<clsTimeSheet> getAllTimeSheet()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllTimeSheet");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsTimeSheet> _myTimeSheetList = new List<clsTimeSheet>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                clsTimeSheet _myTimeSheet = new clsTimeSheet();
                //und hier die Daten nach Index
                _myTimeSheet.ID = (int)_dr["SId"];
                _myTimeSheet.UserID = (int)_dr["SUserId"];
                _myTimeSheet.ProjectID = (int)_dr["SProjectId"];
                _myTimeSheet.Date = (DateTime)_dr["SDate"];
                _myTimeSheet.Hours = (int)_dr["SHours"];
                _myTimeSheet.Description = (String)_dr["SDescription"];
                _myTimeSheet.Chargeable = (bool)_dr["SChargeable"];
                _myTimeSheet.Category = (String)_dr["SCategory"];
                _myTimeSheet.ProjectName = (String)_dr["PName"];
                _myTimeSheetList.Add(_myTimeSheet);
            }
            return _myTimeSheetList;
        } //getAllTimeSheets() 

        /// <summary>
        /// Update eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt mit geänderten Attributen</param>
        /// <returns>1 falls Update erfolgreich </returns>
        public int UpdateUser(clsUser _User)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Access-Query)
            _myProvider.AddParam("Name", _User.Name, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Position", _User.Position, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("InternalHourlyRate", _User.InternalHourlyRate, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("ID", _User.ID, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QUserUpdateById");

            return _changedSets;
        } //updateUser()

        /// <summary>
        /// Insert eines Userobjekts
        /// </summary>
        /// <param name="_User">User-Objekt</param>
        /// <returns>1 falls Insert erfolgreich </returns>
        public int InsertTimeSheet(clsTimeSheet _TimeSheet)
        {

            //DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            // Jetzt müssen wir erstmal die Übergabeparameter hinzufügen 
            // (Parameter in derselben Reihenfolge wie in der Acess-Query)
            _myProvider.AddParam("UserId", _TimeSheet.UserID, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("ProjectId", _TimeSheet.ProjectID, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Date", _TimeSheet.Date, DAL.DataDefinition.enumerators.SQLDataType.DATETIME);
            _myProvider.AddParam("Hours", _TimeSheet.Hours, DAL.DataDefinition.enumerators.SQLDataType.INT);
            _myProvider.AddParam("Description", _TimeSheet.Description, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);
            _myProvider.AddParam("Chargeable", _TimeSheet.Chargeable, DAL.DataDefinition.enumerators.SQLDataType.BOOL);
            _myProvider.AddParam("Category", _TimeSheet.Category, DAL.DataDefinition.enumerators.SQLDataType.VARCHAR);

            //Ausführen und veränderte Zeilen zurückgeben
            int _changedSets = _myProvider.MakeStoredProcedureAction("QTimeSheetInsert");

            return _changedSets;
        } //updateUser()

       /// <summary>
        /// Zählt Anzahl users via SQL-Abfrage
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public int CountUsers1()
        {
            int _count;

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QCountUsers");

            //das Ergebnis von QCountUsers ist eine Tabelle mit einer Zeile und einer Spalte
            DataRow _dr = _myDataSet.Tables[0].Rows[0];

            _count = (int)_dr[0];

            return _count;
        } // CountUsers1()

        /// <summary>
        /// Zählt Anzahl Users, indem erst alle eingelesen werden und dann Länge der Liste zurückgegeben wird
        /// (alternative Methode zu CountUser1())
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public int CountUsers2()
        {
            int _count;
            List<clsTimeSheet> _TimeSheetList;

            _TimeSheetList = getAllTimeSheet();
            _count = _TimeSheetList.Count;

            return _count;
        } // CountUsers2()

        /// <summary>
        /// Replies all timesheets by sessionID of the loged in user
        /// </summary>
        /// <param name="_id"></param>
        /// <returns>Anzahl Users</returns>
        public List<clsTimeSheet> GetTimeSheetbySession()
        {
            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Jetzt müssen wir erstmal den Übergabeparameter hinzufügen
            _myProvider.AddParam("ID", bll.clsUser.Session, DAL.DataDefinition.enumerators.SQLDataType.INT);

            //Hier wird unser Dataset initialisiert
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetTimeSheetBySession");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsTimeSheet> _myTimeSheetList = new List<clsTimeSheet>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                clsTimeSheet _myTimeSheet = new clsTimeSheet();
                //und hier die Daten nach Index
                _myTimeSheet.ID = (int)_dr["SID"];
                _myTimeSheet.ProjectID = (int)_dr["SProjectId"];
                _myTimeSheet.Date = (DateTime)_dr["SDate"];
                _myTimeSheet.Hours = (int)_dr["SHours"];
                _myTimeSheet.Description = (String)_dr["SDescription"];
                _myTimeSheet.ProjectName = (String)_dr["PName"];
                _myTimeSheet.Category = (String)_dr["SCategory"];
                _myTimeSheetList.Add(_myTimeSheet);
            }
            return _myTimeSheetList;

        } // getUserbySessionId()

        /// <summary>
        /// Replies all Timesheets ONLY of the employees
        /// </summary>
        /// <returns></returns>
        public List<clsTimeSheet> getAllTimeSheetOfEmployee()
        {

            //Hier wird ein DB-Provider instanziiert und eine Verbindung zur Access-Datenbank aufgebaut
            DAL.DALObjects.dDataProvider _myProvider = DAL.DataFactory.GetAccessDBProvider(_databaseFile);

            //Hier wird unser Dataset aus der DB befüllt
            DataSet _myDataSet = _myProvider.GetStoredProcedureDSResult("QGetAllTimeSheetOfEmployee");

            //das DataSet enthält nur eine DataTable
            DataTable _myDataTable = _myDataSet.Tables[0];

            //Instantiieren eine Liste von User-Objekten
            List<clsTimeSheet> _myTimeSheetList = new List<clsTimeSheet>();

            //Lesen wir jetzt Zeile (DataRow) für Zeile
            foreach (DataRow _dr in _myDataTable.Rows)
            {
                //Wir füllen unsere Liste immer mit neuen Usern
                clsTimeSheet _myTimeSheet = new clsTimeSheet();
                //und hier die Daten nach Index
                _myTimeSheet.ID = (int)_dr["SId"];
                _myTimeSheet.UserID = (int)_dr["SUserId"];
                _myTimeSheet.UserName = (String)_dr["UName"];
                _myTimeSheet.ProjectID = (int)_dr["SProjectId"];
                _myTimeSheet.Date = (DateTime)_dr["SDate"];
                _myTimeSheet.Hours = (int)_dr["SHours"];
                _myTimeSheet.Description = (String)_dr["SDescription"];
                _myTimeSheet.Chargeable = (bool)_dr["SChargeable"];
                _myTimeSheet.Category = (String)_dr["SCategory"];
                _myTimeSheet.ProjectName = (String)_dr["PName"];
                _myTimeSheetList.Add(_myTimeSheet);
            }
            return _myTimeSheetList;
        } //getAllTimeSheetOfEmployee() 
    }
}